package org.flower.isme.common.service;

import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
 * RedisService类提供了对Redis数据库的基本操作，包括存储、查询和删除数据。
 * 该类使用Spring的RedisTemplate来简化对Redis的操作。
 */
@Service
public class RedisService {

    /**
     * 自动注入RedisTemplate，用于操作Redis数据库。
     */
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 将给定的value保存到Redis中，使用指定的key进行标识。
     *
     * @param key   数据在Redis中的唯一标识符。
     * @param value 要保存到Redis中的数据。
     */
    public void save(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 根据指定的key从Redis中查询数据。
     *
     * @param key 数据在Redis中的唯一标识符。
     * @return 与key对应的数据。
     */
    public Object find(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 根据指定的key从Redis中删除数据。
     *
     * @param key 要删除的数据在Redis中的标识符。
     */
    public void delete(String key) {
        redisTemplate.delete(key);
    }

    /**
     * 增加一个元素到指定的集合。
     *
     * @param key   集合的key
     * @param value 要添加的元素
     */
    public void addToSet(String key, Object value) {
        redisTemplate.opsForSet().add(key, value);
    }

    /**
     * 从指定集合中移除一个元素。
     *
     * @param key   集合的key
     * @param value 要移除的元素
     */
    public void removeFromSet(String key, Object value) {
        redisTemplate.opsForSet().remove(key, value);
    }

    /**
     * 获取指定集合中的所有元素。
     *
     * @param key 集合的key
     * @return 集合中的所有元素
     */
    public Set<Object> members(String key) {
        return redisTemplate.opsForSet().members(key);
    }

    /**
     * 将给定的value保存到Redis中，设置过期时间（单位：秒）。
     *
     * @param key        数据在Redis中的唯一标识符。
     * @param value      要保存到Redis中的数据。
     * @param timeout    过期时间（单位：秒）。
     */
    public void saveWithExpiration(String key, Object value, long timeout) {
        redisTemplate.opsForValue().set(key, value, timeout);
    }

    /**
     * 获取指定key的剩余过期时间（单位：秒）。
     *
     * @param key 数据在Redis中的唯一标识符。
     * @return 剩余过期时间（单位：秒）。
     */
    public Long getRemainingTTL(String key) {
        return redisTemplate.getExpire(key);
    }
}
